import axios from 'axios'
import router from '@/router'
import { getToken } from '@/utils/cookie'

// 创建请求实例
const instance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL,
  // 指定请求超时的毫秒数
  timeout: 10000,
  // 表示跨域请求时是否需要使用凭证
  withCredentials: true
})

// 前置拦截器（发起请求之前的拦截）
instance.interceptors.request.use(
  (config) => {
    /**
     * 在这里一般会携带前台的参数发送给后台，比如下面这段代码：
     *
     */
    const token = getToken()
    if (token) {
      config.headers.Authorization = token
    } else {
      console.log('no token')
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 后置拦截器（获取到响应时的拦截）
instance.interceptors.response.use(
  (response) => {
    /**
     * 根据你的项目实际情况来对 response 和 error 做处理
     */
    // 未设置状态码则默认成功状态
    const code = response.data.code || 200
    const msg = response.data.message || 'error'

    if (code === 400) {
      ElMessage({
        message: msg,
        type: 'warning'
      })
    } else if (code === 403) {
      // 未登录
      ElMessageBox.confirm(
        '登录状态已过期，您可以继续留在该页面，或者重新登录',
        '系统提示',
        {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning',
        }
      )
      .then(() => {
        router.push('/login')
      })
      .catch(() => {})
    } else if (code === 404) {
      ElMessage({
        message: msg,
        type: 'warning'
      })
      router.push('/404')
    } else if (response.data.code === 500) {
      ElMessage({
        message: msg,
        type: 'error'
      })
      router.push('/500')
    } else if (code != 200) {
      ElMessage({
        message: msg,
        type: 'warning'
      })
      return Promise.reject(response.data.data)
    } else {
      // 后台成功的结果
      // 如果是文件
      if (response.config.responseType === 'blob') {
        return Promise.resolve(response.data)
      }
      return Promise.resolve(response.data.data)
    }
  },
  (error) => {
    const { response } = error
    if (response && response.data) {
      return Promise.reject(error)
    }
    const { message } = error
    console.error(message)
    return Promise.reject(error)
  }
)

// 导出常用函数

/**
 * @param {string} url
 * @param {object} data
 * @param {object} params
 */
export const post = (url, data = {}, params = {}) => {
  return instance({
    method: 'post',
    url,
    data,
    params
  })
}

/**
 * @param {string} url
 * @param {object} params
 */
export const get = (url, params = {}) => {
  return instance({
    method: 'get',
    url,
    params
  })
}

/**
 * @param {string} url
 * @param {object} data
 * @param {object} params
 */
export const put = (url, data = {}, params = {}) => {
  return instance({
    method: 'put',
    url,
    params,
    data
  })
}

/**
 * @param {string} url
 * @param {object} params
 */
export const _delete = (url, params = {}) => {
  return instance({
    method: 'delete',
    url,
    params
  })
}

/**
 * @param {string} url
 * @param {object} params
 */
export const getBlob = (url, params = {}) => {
  return instance({
    method: 'get',
    responseType: 'blob',
    url,
    params
  })
}

/**
 * @param {string} url
 * @param {object} data
 * @param {object} params
 */
export const postBlob = (url, data = {}, params = {}) => {
  return instance({
    method: 'post',
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    url,
    data,
    params
  })
}

export default instance
